package com.olap.starter.core.base;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.olap.starter.util.StringUtils;
import com.olap.starter.util.servlet.ServletUtils;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;


@Slf4j
/**
 * @author WBG
 * @date 2022/8/30 22:25
 * @describe
 */
public class QueryGenerator {

    public static void main(String[] args) {
        System.out.println("!1230".substring(1));
    }

    private static boolean stringIsLike(String value, boolean isLeft) {
        return isLeft ? value.indexOf("*") == 0 : value.lastIndexOf("*") == value.length() - 1;
    }

    private static void doSetLikeOrQe(QueryWrapper queryWrapper, String filedName, String valueNew) {
        boolean likeLeft = stringIsLike(valueNew, true);
        boolean likeRight = stringIsLike(valueNew, false);
        valueNew = valueNew.replaceAll("\\*", "");
        if (valueNew.trim().length() != 0) {
            // *132*
            if (likeLeft && likeRight) {
                queryWrapper.like(filedName, valueNew);
            } else if (likeLeft) {
                //*123
                queryWrapper.likeLeft(filedName, valueNew);
            } else if (likeRight) {
                //123*
                queryWrapper.likeRight(filedName, valueNew);
            } else {
                if (valueNew.indexOf("!") == 0) {
                    //!123
                    queryWrapper.eq(filedName, valueNew.substring(1));
                } else {
                    //123
                    queryWrapper.eq(filedName, valueNew);
                }
            }
        }
    }

    private static <T> QueryWrapper<T> setLikeOrQe(QueryWrapper<T> queryWrapper, String filedName, String value) {
        String[] values = value.split(",");
        //要先一个一个遍历，特殊情况 *123,123,123*,*123*
        if (values.length > 1) {
            queryWrapper.and(q->{
                for (String valueNew : values) {
                    q.or();
                    doSetLikeOrQe(q, filedName, valueNew);
                }
            });
        } else {
            //123 || *123
            doSetLikeOrQe(queryWrapper, filedName, value);
        }
        return queryWrapper;
    }

    public static <T> QueryWrapper<T> initQueryWrapper(T searchObj) {
        QueryWrapper<T> queryWrapper = new QueryWrapper();
        Class<?> aClass = searchObj.getClass();
        Field[] fields = aClass.getDeclaredFields();
        for (Field field : fields) {
            if (Modifier.isStatic(field.getModifiers())) {
                continue;
            }
            field.setAccessible(true);
            try {
                Object value = field.get(searchObj);
                String filedName = field.getName();
                String filedNameSC = StringUtils.toUnderScoreCase(filedName);
                if (StringUtils.isNotNull(value)) {
                    if (value instanceof String) {
                        String v = (String) value;
                        setLikeOrQe(queryWrapper, filedNameSC, v);
                    } else {
                        queryWrapper.eq(filedNameSC, value);
                    }
                } else {
                    String filedNameStart = ServletUtils.getParameter(filedName + "_start");
                    String filedNameEnd = ServletUtils.getParameter(filedName + "_end");
                    if (StringUtils.isNotNull(filedNameStart) && StringUtils.isNotNull(filedNameEnd)) {
                        queryWrapper.between(filedNameSC, filedNameStart, filedNameEnd);
                    } else if (StringUtils.isNotNull(filedNameStart)) {
                        queryWrapper.ge(filedNameSC, filedNameStart);
                    } else if (StringUtils.isNotNull(filedNameEnd)) {
                        queryWrapper.le(filedNameSC, filedNameEnd);
                    }
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return queryWrapper;
    }


}
